大家好,我是 Yubin
這篇文章會介紹 Fastify 的 Logging 機制。
Log,中文翻譯可能會翻譯成"日誌"。
身為一個開發者,你有寫 log 的習慣嗎?
以 JavaScript 來說,console.log()
應該是許多人非常熟悉也是天天用的工具,可以把想要的訊息或變數印出來,開發的時候常常會需要他。
console.log('Hello World')
但寫 log 是一件成本非常高的事情,會做到 IO 的操作,特別是 console.log
或 printf
這種,會直接把 log 寫到標準輸出的函式。更別提 log 的保存或 log 的查詢。
首先,我們應該選用適合的工具,並在適當的時機點寫 log,還有對重要的事件或特殊的情況寫 log。
Pino 是一個 JavaScript 的 Logger 函式庫,效能很好且針對 log 劃分了多種等級 Log Level。
trace
debug
info
warn
error
fatal
針對不同事件的嚴重程度,開發者可以選用適合的 level,這樣維運人員在看 log 的時候會更好抓到系統的問題。
以 Fastify 的開發來說,寫 log 非常容易,因為 Fastify 的核心已經內建的 Pino !
只需要在啟動 server 的時候,把 logger
打開。
import fastify, { FastifyInstance } from 'fastify'
const server: FastifyInstance = fastify({
logger: true
}
)
沒錯,只要把 logger
這個 option 設為 true
,就可以開啟內建的 logging 機制。
在 FastifyInstance
, FastifyRequest
, FastifyReply
這三個物件中,都有定義了 log
這個欄位,而這個欄位就可以拿到我們的 logger instance 也就是 Pino。
因為這樣,寫 log 變得非常容易。
server.log.info("an info message')
在 route 的定義中可以利用 request 或 reply 這兩個參數來拿到 logger。
server.get('/', (request, reply) => {
request.log.info('Hello World')
return reply.status(200).send({message: 'Hello World"})
}
如果事後想對 app 的 request 進行分析,那我們勢必要把每個進來的 request 都 log 起來,但在每個 route handler 裡面寫寫 log 的動作又太麻煩。
因此,Fastify 預設在 onRequest
hook,也就是 request 進來,開始生命週期的第一個 hook 就會寫 log。
然後在生命週期結束的最後一個 hook,onResponse
hook,把 response 送出去後也會寫 log。
所以對開發者來說,只要在啟動 server 的時候把 log 的功能開起來,Fastify 就會幫你處理好最基本的 log,也就是 request 進來跟 response 出去的時間點。
寫 log 原本是件麻煩又費力的工作,但因為 Fastify 對於 Pino 這個優秀的 logging 工具的整合很好,大大減輕開發者的負擔,讓開發人員可以更加專注於其他功能的開發或思考寫怎樣的可以更方便日後的維運上。